# ==============================================
# 一、数字类型：处理各类数值场景（整数、浮点数、复数）
# ==============================================

# 1. 整数（int）：无小数部分，适合计数、编号等精确场景
## 场景1：学生学号与座位号映射（整数作为唯一标识）
# 学号列表（整数唯一标识每个学生）
student_ids = [2023001, 2023002, 2023003]
# 字典：键为学号（int），值为座位号（int），实现快速查询
seat_numbers = {2023001: 5, 2023002: 12, 2023003: 8}
# 通过学号（整数键）查询座位号
print(f"【整数】2023002的座位号：{seat_numbers[2023002]}")  # 输出：12

## 场景2：倒计时功能（整数递减操作）
countdown = 3  # 初始倒计时（整数）
while countdown > 0:  # 当倒计时大于0时循环
    print(f"倒计时：{countdown}...")
    countdown -= 1  # 整数递减（每次减1）
print("出发！")  # 倒计时结束后执行


# 2. 浮点数（float）：带小数部分，适合需要精度的场景
## 场景1：厨房配方（食材重量需精确到小数）
recipe = {
    "面粉": 250.5,  # 面粉250.5克（浮点数）
    "糖": 50.0,     # 糖50.0克（浮点数，整数也可表示为小数）
    "黄油": 125.75  # 黄油125.75克（浮点数）
}
# 计算总重量：对字典中的浮点数 values 求和
total_weight = sum(recipe.values())
# 保留1位小数输出（浮点数精度控制）
print(f"【浮点数】配方总重量：{total_weight:.1f}克")  # 输出：426.3克

## 场景2：温度转换（摄氏度→华氏度，涉及小数运算）
celsius = 25.5  # 摄氏度（浮点数）
# 转换公式：华氏度 = 摄氏度 × 1.8 + 32（浮点数乘法和加法）
fahrenheit = celsius * 1.8 + 32
# 保留1位小数输出转换结果
print(f"{celsius}℃ = {fahrenheit:.1f}℉")  # 输出：77.9℉


# 3. 复数（complex）：由实部和虚部组成（虚部以j结尾），多用于专业领域
## 场景：电路阻抗计算（电阻为实部，电抗为虚部）
resistor = 3 + 0j  # 纯电阻（实部3Ω，虚部0，复数表示）
inductor = 0 + 4j  # 纯电感（感抗4Ω，实部0，虚部4j）
total_impedance = resistor + inductor  # 复数加法：总阻抗 = 电阻 + 电抗
# 复数的模值（阻抗大小）通过abs()计算
print(f"【复数】电路总阻抗：{total_impedance}Ω，模值：{abs(total_impedance)}Ω")  # 模值5Ω


# ==============================================
# 二、组合数据类型：处理批量/结构化数据（列表、元组、字典、集合）
# ==============================================

# 1. 列表（list）：有序、可变（可增删改），适合存储动态变化的序列
## 场景1：游戏背包（随时添加/删除物品）
backpack = ["金币×100", "治疗药水", "铁剑"]  # 初始背包物品（列表）
backpack.append("魔法盾")  # 新增物品（列表可变：添加操作）
backpack.remove("治疗药水")  # 使用物品（列表可变：删除操作）
print("【列表】游戏背包：", backpack)  # 输出：['金币×100', '铁剑', '魔法盾']

## 场景2：成绩排名（列表排序功能）
scores = [88, 95, 76, 92, 80]  # 成绩列表（整数/浮点数混合）
scores.sort(reverse=True)  # 降序排序（列表可变：修改顺序）
print("【列表】成绩排名：", scores)  # 输出：[95, 92, 88, 80, 76]


# 2. 元组（tuple）：有序、不可变（保护数据不被修改），适合固定数据
## 场景1：RGB颜色值（三原色比例固定，不允许修改）
red = (255, 0, 0)    # 红色：(红, 绿, 蓝) 元组
blue = (0, 0, 255)   # 蓝色：元组
# 函数：混合两种颜色（取三原色平均值，返回新元组）
def mix_color(c1, c2):
    # 元组解包：分别获取c1和c2的红、绿、蓝分量
    r1, g1, b1 = c1
    r2, g2, b2 = c2
    # 计算混合后的分量，返回新元组（原元组仍不可变）
    return ((r1 + r2) // 2, (g1 + g2) // 2, (b1 + b2) // 2)

purple = mix_color(red, blue)  # 红+蓝=紫色
print(f"【元组】红+蓝=紫色：{purple}")  # 输出：(127, 0, 127)

## 场景2：每周固定课程表（课程安排不允许随意修改）
weekly_courses = (
    ("周一", "数学", "语文"),  # 元组内嵌套元组
    ("周二", "英语", "物理")
)
# 取周二的课程（元组索引：第2个元素的第2个开始）
print("【元组】周二课程：", weekly_courses[1][1:])  # 输出：('英语', '物理')


# 3. 字典（dict）：键值对映射，通过键快速查询值，适合对象属性
## 场景1：翻译词典（中文→英文，键为中文，值为英文）
translator = {
    "苹果": "apple",
    "香蕉": "banana",
    "猫": "cat"
}
# 通过键（"香蕉"）查询对应的值（英文翻译）
print(f"【字典】'香蕉'的英文：{translator['香蕉']}")  # 输出：banana

## 场景2：用户设置（键为配置项，值为状态/参数）
user_settings = {
    "通知": True,      # 布尔值（特殊的整数派生类型）
    "夜间模式": False,
    "字体大小": 16     # 整数
}
user_settings["夜间模式"] = True  # 修改字典值（字典可变）
print("【字典】更新后设置：", user_settings)  # 夜间模式已改为True


# 4. 集合（set）：无序、不可重复，适合去重和集合运算
## 场景1：投票统计（去除重复投票，确保每人仅算1票）
votes = ["张三", "李四", "张三", "王五", "李四"]  # 原始投票（含重复）
unique_voters = set(votes)  # 转换为集合：自动去重
print("【集合】有效投票人：", unique_voters)  # 输出：{'张三', '李四', '王五'}

## 场景2：合并歌单（合并两个列表并去重）
my_songs = {"青花瓷", "晴天", "告白气球"}  # 我的歌单（集合）
friend_songs = {"晴天", "七里香", "一路向北"}  # 朋友的歌单（集合）
all_songs = my_songs | friend_songs  # 并集运算：合并并去重
print("【集合】合并后歌单：", all_songs)  # 输出6首不重复歌曲


# ==============================================
# 三、混合类型场景：多种数据类型结合使用（贴近实际开发）
# ==============================================
## 场景：学生信息系统（综合运用所有数据类型）
student = {
    "id": 2023001,  # 整数：学号
    "name": "小明",  # 字符串（基础类型，未单独讲但常用）
    "scores": [90.5, 88, 95.0],  # 列表：成绩（浮点数+整数）
    "hobbies": {"篮球", "编程"},  # 集合：爱好（去重）
    "address": ("北京市", "海淀区")  # 元组：地址（固定不变）
}

# 计算平均分：对列表中的成绩求和后除以科目数（浮点数运算）
avg_score = sum(student["scores"]) / len(student["scores"])
print(f"\n【混合类型】{student['name']}的平均分：{avg_score:.1f}")  # 保留1位小数
print("爱好：", student["hobbies"])  # 输出集合中的爱好
print("地址：", student["address"][0])  # 输出元组中的城市（第1个元素)